package com.example.jetpackpaging.paging

import androidx.paging.PagingSource
import androidx.paging.PagingState
import com.example.jetpackpaging.model.Repo
import com.example.jetpackpaging.net.Api
import com.example.jetpackpaging.net.RetrofitClient
import kotlinx.coroutines.delay
import java.lang.Exception

/**
 * 第一个类型表示页数的数据类型，我们没有特殊需求，所以直接用整型就可以了。第二个类型表示每一项数据（注意不是每一页）
 * 所对应的对象类型，这里使用刚才定义的Repo。
 */
class RepoPagingSource: PagingSource<Int, Repo>() {
    //params.key就是代表着当前的页数。注意key是可能为null的，如果为null的话，我们就默认将当前页数设置为第一页。
    // 另外还可以通过params参数得到loadSize，表示每一页包含多少条数据，这个数据的大小我们可以在稍后设置。
    override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Repo> {
        delay(3000) //delay是为了显示加载动画，要不动画看不清楚
        val currentPage = params.key ?: 1
        val pageSize = params.loadSize
        val repoResponse = RetrofitClient.createApi(Api::class.java).getRepos(currentPage,pageSize)
        val repoItems = repoResponse.items

        val realPageSize = 8
        val initialPageSize = 16

        var prevKey: Int? = null
        var nextKey: Int? = null
        if(currentPage == 1){
            prevKey = null
            nextKey = initialPageSize / realPageSize +1
        }else{
            prevKey = currentPage - 1
            nextKey = if (repoItems.isNotEmpty()) currentPage + 1 else null
        }

       return try {
           LoadResult.Page(
               data = repoResponse.items,
               prevKey = prevKey,
               nextKey = nextKey
           )
       }catch (e :Exception){
           e.printStackTrace()
           return LoadResult.Error(e)
       }
    }

    override fun getRefreshKey(state: PagingState<Int, Repo>): Int? {
        return null
    }


}